package com.cskaoyan.javase._1extends._10final._2method;

/**
 * final修饰方法表示最后的方法，最终的方法
 * 表示该方法无法被重写,（但是仍然可以被继承）。
 * 语法:
 * [访问权限修饰符] final 返回值类型 方法名(形参列表){
 *  //方法体
 * }
 *
 * 说明：
 *      1.final修饰成员方法，表示该方法无法被重写，但是仍然是可以继承的。
 *      什么样的成员方法应该设置为final呢？
 *      2.方法的设计已经比较完善，不需要子类进行修改了，子类只需要乖乖继承，使用父类的实现即可。
 *      3.比如一旦修改就会导致问题、bug等时，就可以设置为final修饰。
 *      4.即便是父类的方法不是很完善，但只要是希望子类不要改写方法都可以这么做。
 *          （要么你就用，不爽你就自己实现一个）
 * 同样比较多见于JDK源码中，比较常见的有：像Object类中的getClass()方法还有其中和线程相关的方法。
 *
 * 不能被重写的方法:
 *      1.私有方法
 *      2.构造方法
 *      3.静态方法
 *      4.final修饰的方法
 *
 * 扩展/趣味知识/知道了也没用,但是可以"装个杯"的小知识:
 * final关键字能不能修饰:
 *      1.私有方法
 *          本身就不能被子类重写
 *          再加final属于没必要
 *          但是仍然可以加
 *
 *      2.构造方法
 *          构造方法不能用final修饰
 *
 *      3.静态方法
 *          本身就不能被子类重写
 *          再加final属于没必要
 *          但是仍然可以加
 *
 * @since 11:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        s.eat();
    }
}

class Person {
    public final void eat() {
        System.out.println("是人就应该好好吃饭!");
    }

    // 'private' method declared 'final'
    private final void test() {
    }

    // 'static' method declared 'final'
    public final static void testStatic(){}

    // public final Person() {
    // }
}

class Student extends Person {
    /*@Override
    public void eat() {
        System.out.println("我吃学生餐!");
    }*/
}

class LaoBa extends Person {
    // eat
}